﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
using Update.Dll;
using Update.UI;

namespace Update
{
    internal static class Program
    {
        // 更新器版本常量
        public const string UpdaterVersion = "1.0.5";

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                // 在任何其他代码执行前初始化DLL加载器
                LoadDll.LoadResourceDll();

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                // 检查配置文件是否存在，如果不存在则创建示例配置文件
                CheckAndCreateConfigFile();

                // 检查是否提供了版本参数
                if (args.Length > 0)
                {
                    string version = args[0];
                    // 验证版本号格式
                    if (IsVersionFormat(version))
                    {
                        // 版本号格式正确，使用命令行参数传入的版本号
                        Application.Run(new FrmMain(version));
                    }
                    else
                    {
                        // 版本号格式错误，显示错误信息
                        MessageBox.Show($"提供的版本号 \"{version}\" 格式无效。正确的版本号格式应为：1.0.0",
                            "版本号格式错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        // 结束
                        Application.Exit();
                    }
                }
                else
                {
                    // 没有版本参数，使用默认构造函数
                    Application.Run(new FrmMain());
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"更新器启动时发生错误: {ex.Message}\n\n{ex.StackTrace}",
                    "启动错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 结束
                Application.Exit();
            }
        }

        /// <summary>
        /// 检查配置文件是否存在，如果不存在则创建示例配置文件
        /// </summary>
        private static void CheckAndCreateConfigFile()
        {
            string configFile = "UpdateConfig.xml";

            // 如果配置文件已存在，直接返回
            if (File.Exists(configFile))
            {
                return;
            }

            try
            {
                // 从嵌入资源中提取示例配置文件
                using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Update.UpdateConfig.example.xml"))
                {
                    if (stream != null)
                    {
                        // 创建配置文件
                        using (FileStream fileStream = new FileStream(configFile, FileMode.Create, FileAccess.Write))
                        {
                            byte[] buffer = new byte[8192];
                            int bytesRead;
                            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                fileStream.Write(buffer, 0, bytesRead);
                            }
                        }

                        // 显示提示信息
                        MessageBox.Show(
                            "已创建配置文件 UpdateConfig.xml\n\n" +
                            "请根据您的需求编辑此文件，配置更新服务器信息和应用程序设置。\n\n" +
                            "配置完成后重新启动更新程序。",
                            "配置文件已创建",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                        // 强制退出应用程序
                        Environment.Exit(0);
                    }
                    else
                    {
                        MessageBox.Show(
                            "无法找到示例配置文件资源。\n\n" +
                            "请手动创建配置文件 UpdateConfig.xml。",
                            "配置文件创建失败",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Warning);

                        // 列出所有嵌入资源，帮助调试
                        string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
                        Console.WriteLine("可用嵌入资源:");
                        foreach (string resource in resources)
                        {
                            Console.WriteLine($"- {resource}");
                        }
                        
                        // 强制退出应用程序
                        Environment.Exit(1);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    $"创建配置文件时出错: {ex.Message}\n\n" +
                    "请手动创建配置文件 UpdateConfig.xml。",
                    "配置文件创建失败",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                
                // 强制退出应用程序
                Environment.Exit(1);
            }
        }

        /// <summary>
        /// 检查字符串是否符合版本号格式 (x.y.z)
        /// </summary>
        private static bool IsVersionFormat(string text)
        {
            // 简单检查版本号格式，例如 1.0.0, 1.2.3.4 等
            if (string.IsNullOrEmpty(text))
                return false;

            string[] parts = text.Split('.');

            // 至少需要有一个数字部分
            if (parts.Length == 0)
                return false;

            // 检查每个部分是否都是数字
            foreach (var part in parts)
            {
                if (!int.TryParse(part, out _))
                    return false;
            }

            return true;
        }
    }
}

